package vengadores;
/**
 *Es la clase que anima al juego. Actualiza la aplicación muchas veces por segundo. Este número es dado por uno de sus atributos. En este tiempo dibuja
 * los elementos en el estado en el que se encuentren en el momento de actualizarlos.
 * @author Felipe Donato Arrazola Gómez
 * @author Jorge de Jesús Tinoco Huesca
 * @author Arturo Ayala Tello
 */
public class Animador implements Runnable {

    private Animable juego; // todos los objetos que implementen la clase animable, son animados por Animador.
    private boolean corriendo; //cuando corriendo sea true, se ejecutará Run.
    private int FPS = 29; // Indica los Frames Por Segundo a los que corre el juego.
    private final int RETARDO = 1000/FPS; //FPS = Frames Por Segundo. Indica el retardo para el thread.
    private Thread thread; // Es el objeto sobre el que corre el juego para poder ser animado.

    /**
     *Constructor del Animador del juego, recibe un objeto que implemente la interfaz Animable.
     * @param jgo Es cualquier objeto que implemente la interfaz Animable, es decir, que se pueda animar o mover en el juego.
     */
    public Animador(Animable jgo){
        this.juego = jgo;
    }
    /**
     * Método que hace que se anime el juego. Usa un ciclo para actualizar el estado del juego FPS veces por segundo.
     */
    public void run() {
        corriendo = true;

        while(corriendo){
            //Indicarle al juego que se actualice. Que mueva los objetos de acuerdo al tiempo o entrada.
            //Actualizar pantalla. En resumen, actualizar objetos, posición, dibujar todo.
            juego.actualizar();
            if (corriendo){
                juego.dibujar();
                try {

                    Thread.sleep(RETARDO);
                } catch (InterruptedException ex) {
                    ex.printStackTrace();
                }

            }

        }
        thread = null;
        juego = null;
    }

    /**
     * Método que crea el thread y lo inicializa.
     */
    public void iniciar(){
        thread = new Thread(this);
        thread.start();  //Llama de alguna forma al metodo run.
    }

    /**
     * Metodo que termina el ciclo que actualiza el juego.
     */
    public void terminar(){
        corriendo = false;
    }

}